package com.cskaoyan.servlet;

import com.cskaoyan.bean.AdminListParameter;
import com.cskaoyan.bean.PageData;
import com.cskaoyan.bean.vo.BaseRespVo;
import com.cskaoyan.common.CommonServlet;
import com.cskaoyan.model.MarketAdmin;
import com.cskaoyan.service.AdminService;
import com.cskaoyan.service.LogService;
import com.cskaoyan.service.impl.AdminServiceImpl;
import com.cskaoyan.service.impl.LogServiceImpl;
import com.cskaoyan.utils.Constant;
import com.cskaoyan.utils.JacksonUtil;
import com.cskaoyan.utils.TransactionUtil;
import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

/**
 * @Author Pudding
 * @Date 2024/5/30 10:34
 */
@WebServlet("/admin/admin/*")
public class AdminAdminServlet extends CommonServlet {

    AdminService adminService = new AdminServiceImpl();
    LogService logService = new LogServiceImpl();

    public BaseRespVo list(HttpServletRequest request, HttpServletResponse response) throws InvocationTargetException, IllegalAccessException {
        //获取请求参数，放到一个map中
        Map<String, String[]> parameterMap = request.getParameterMap();
        //通过beanutils把请求参数封装到AdminListParameter
        AdminListParameter adminListParameter = new AdminListParameter();
        BeanUtils.copyProperties(adminListParameter, parameterMap);

        //调用service来处理业务查询代码，根据请求参数，返回的是响应报文中的data
        //data中list的封装交给service处理，因为里面通过example查询出来就是List，处理比较方法
        PageData data = adminService.list(adminListParameter);

        //返回响应报文
        return BaseRespVo.ok(data);
    }

    public BaseRespVo create(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1 获取post请求体
        String jsonStr = request.getReader().readLine();
        //1.1 将json字符串封装到一个对象MarketAdmin：通过JacksonUtil
        MarketAdmin marketAdmin = JacksonUtil.read(jsonStr, MarketAdmin.class);

        //开启事务
        TransactionUtil.startTransaction();

        //调用service来处理业务，根据请求体数据，返回响应报文中的data
        //这里响应报文中的数据data依旧使用MarketAdmin对象进行封装
        MarketAdmin data = adminService.create(marketAdmin);

        //对响应数据data进行判断，进而选择对应的响应报文
        if (data != null) {
            //添加日志
            logService.insertLog(request, 1, "添加管理员", true, data.getUsername(), "");
            //关闭事务
            TransactionUtil.commit();
            return BaseRespVo.ok(data);
        } else {
            //添加日志
            logService.insertLog(request, 1, "添加管理员", false, "失败，管理员已经存在", "");
            //关闭事务
            TransactionUtil.commit();
            return BaseRespVo.fail("管理员已经存在", 602);
        }
    }

    public BaseRespVo update(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1 获取post请求体
        String jsonStr = request.getReader().readLine();
        //1.1 将json字符串封装到一个对象MarketAdmin：通过JacksonUtil
        MarketAdmin marketAdmin = JacksonUtil.read(jsonStr, MarketAdmin.class);

        //开启事务
        TransactionUtil.startTransaction();

        //调用service来处理业务，根据请求体数据，返回响应报文中的data
        //这里响应报文中的数据data依旧使用MarketAdmin对象进行封装
        MarketAdmin data = adminService.update(marketAdmin);
        //2. 通过 data 来判断是否能够更新
        if (data == null) {
            //添加日志
            logService.insertLog(request, 1, "更新管理员", true, "失败，管理员已经存在", "");

            //关闭事务
            TransactionUtil.commit();

            return BaseRespVo.fail("管理员已经存在", 602);
        } else {
            //添加日志
            logService.insertLog(request, 1, "更新管理员", true, data.getUsername(), "");

            //关闭事务
            TransactionUtil.commit();

            //返回响应报文
            return BaseRespVo.ok(data);
        }
    }

    public BaseRespVo delete(HttpServletRequest request, HttpServletResponse response) throws IOException {
        //1 获取post请求体
        String jsonStr = request.getReader().readLine();
        //1.1 将json字符串封装到一个对象MarketAdmin：通过JacksonUtil
        MarketAdmin marketAdmin = JacksonUtil.read(jsonStr, MarketAdmin.class);

        //开启事务
        TransactionUtil.startTransaction();

        //调用service来处理业务，根据请求体数据，这里就不需要返回响应报文的data数据了
        //2.1 判断一下是不是当前用户
        HttpSession session = request.getSession();
        Integer id = (Integer) session.getAttribute(Constant.ADMIN_KEY);
        if (id.equals(marketAdmin.getId())) {
            //删除失败日志
            logService.insertLog(request, 1, "删除管理员", false, "删除失败，管理员不能删除自己账号", "");

            //关闭事务
            TransactionUtil.commit();

            return BaseRespVo.fail("管理员不能删除自己账号", 604);
        }

        //2.2 不是当前用户可以删除
        adminService.delete(marketAdmin);

        //删除成功日志
        logService.insertLog(request, 1, "删除管理员", true, marketAdmin.getUsername(), "");

        //关闭事务
        TransactionUtil.commit();

        //返回响应报文
        return BaseRespVo.ok(null);
    }
}
